package com.autotest.nore.service;

import com.autotest.nore.common.exception.DuplicateException;
import com.autotest.nore.dto.ModuleListDTO;
import com.autotest.nore.mapper.ModuleMapper;
import com.autotest.nore.dto.ModuleDTO;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
@Transactional(rollbackFor = Exception.class)
public class ModuleService {

    @Autowired
    private ModuleMapper moduleMapper;

    public void updateCaseModule(String id ,String name){

        moduleMapper.updateCaseModule(id,name);
    }
    public void updateCollectionModule(String id ,String name){

        moduleMapper.updateCollectionModule(id,name);
    }

    public void updateApiModule(String id ,String name,String mockPrefix){

        moduleMapper.updateApiModule(id,name,mockPrefix);
    }
    public ModuleDTO saveApiModule(ModuleDTO module){
        ModuleDTO oldModule = moduleMapper.getModuleByParentAndNameFromApiModule(module.getParentId(),module.getName());
        if(oldModule != null){
            throw new DuplicateException("当前父模块下已有重名模块");
        }
        if(module.getId() == null){
            //新增模块
            module.setId(UUID.randomUUID().toString());
            module.setCreateTime(System.currentTimeMillis());
            module.setUpdateTime(System.currentTimeMillis());
            module.setCreateUser(module.getUpdateUser());
            module.setMockPrefix(module.getMockPrefix());
            moduleMapper.saveModuleApi(module);
        }else{
            // 更新模块
            module.setUpdateTime(System.currentTimeMillis());
            module.setUpdateUser(module.getUpdateUser());
            module.setModuleType(module.getType());
            module.setParentId(module.getParentId());
            module.setId(module.getId());
            module.setMockPrefix(module.getMockPrefix());
            moduleMapper.updateModuleApi(module);
        }

        module.setLabel(module.getName());
        return module;
    }

    public ModuleDTO saveCaseModule(ModuleDTO module) {
        ModuleDTO oldModule = moduleMapper.getModuleByParentAndNameFromCaseModule(module.getParentId(),module.getLabel());
        if(oldModule != null){
            throw new DuplicateException("当前父模块下已有重名模块");
        }
        if(module.getId() == null){
            //新增模块
            module.setId(UUID.randomUUID().toString());
            module.setCreateTime(System.currentTimeMillis());
            module.setUpdateTime(System.currentTimeMillis());
            module.setCreateUser(module.getUpdateUser());
            moduleMapper.saveModule(module);
        }else{
            // 更新模块
            module.setUpdateTime(System.currentTimeMillis());
            module.setUpdateUser(module.getUpdateUser());
            module.setModuleType(module.getModuleType());
            module.setParentId(module.getParentId());
            module.setId(module.getId());
            moduleMapper.updateModule(module);
        }

        module.setLabel(module.getName());
        return module;
    }

    public ModuleDTO saveCollectionModule(ModuleDTO module) {
        ModuleDTO oldModule = moduleMapper.getModuleByParentAndNameFromCollectionModule(module.getParentId(),module.getLabel());
        if(oldModule != null){
            throw new DuplicateException("当前父模块下已有重名模块");
        }
        if(module.getId() == null){
            //新增模块
            module.setId(UUID.randomUUID().toString());
            module.setCreateTime(System.currentTimeMillis());
            module.setUpdateTime(System.currentTimeMillis());
            module.setCreateUser(module.getUpdateUser());
            moduleMapper.saveModule(module);
        }else{
            // 更新模块
            module.setUpdateTime(System.currentTimeMillis());
            module.setUpdateUser(module.getUpdateUser());
            module.setModuleType(module.getModuleType());
            module.setParentId(module.getParentId());
            module.setId(module.getId());
            moduleMapper.updateModule(module);
        }

        module.setLabel(module.getName());
        return module;
    }

    public void deleteApi(ModuleDTO module) {
        moduleMapper.deleteApiModule(module.getId());
    }
    public void deleteCase(String moduleId) {
        moduleMapper.deleteCaseModule(moduleId);
    }

    public List<ModuleListDTO> getCollectionModuleList(String projectId){
        List<ModuleListDTO> fina = new ArrayList<>();
        List<ModuleListDTO> apiModuleDTOS = moduleMapper.getCollectionModuleList(projectId);
        for(ModuleListDTO apiModuleDTO: apiModuleDTOS){
            if(apiModuleDTO.getParentId().equals("0")){
                // 先找到所有的根节点
                apiModuleDTO.setChildren(this.nodeList(apiModuleDTOS, apiModuleDTO.getId()));
                fina.add(apiModuleDTO);
            }
        }
        return fina;
    }
    public List<ModuleListDTO> getModuleList(String moduleType, String projectId){
        List<ModuleListDTO> fina = new ArrayList<>();
        List<ModuleListDTO> apiModuleDTOS = moduleMapper.getModuleList(moduleType, projectId);
        for(ModuleListDTO apiModuleDTO: apiModuleDTOS){
            if(apiModuleDTO.getParentId().equals("0")){
                // 先找到所有的根节点
                apiModuleDTO.setChildren(this.nodeList(apiModuleDTOS, apiModuleDTO.getId()));
                fina.add(apiModuleDTO);
            }
        }
        return fina;
    }

    public List<ModuleListDTO> nodeList(List<ModuleListDTO> apiModules, String parentId){
        // 递归查找所有的子节点
        List<ModuleListDTO> childrenList = new ArrayList<>();
        for(ModuleListDTO apiModuleDTO: apiModules){
            if(apiModuleDTO.getParentId().equals(parentId)){
                apiModuleDTO.setChildren(this.nodeList(apiModules, apiModuleDTO.getId()));
                childrenList.add(apiModuleDTO);
            }
        }
        return childrenList;
    }

    public List<ModuleListDTO> getModulesByProjectId(String projectId){
        List<ModuleListDTO> fina = new ArrayList<>();
        List<ModuleListDTO> apiModuleDTOS = moduleMapper.getModulesByProjectId(projectId);
        for(ModuleListDTO apiModuleDTO: apiModuleDTOS){
            if(apiModuleDTO.getParentId().equals("0")){
                // 先找到所有的根节点
                apiModuleDTO.setChildren(this.nodeList(apiModuleDTOS, apiModuleDTO.getId()));
                fina.add(apiModuleDTO);
            }
        }
        return fina;
    }


}
